﻿@namespace AntDesign.Internal
@typeparam TValue
@inherits DatePickerPanelBase<TValue>
@using AntDesign

<div class="@(PrefixCls)-@PickerTypeMap[Picker]-panel @(ShowWeek ? $"{PrefixCls}-{PickerTypeMap[DatePickerType.Date]}-panel-show-week" : string.Empty)" @ref="Ref">
    @if (IsShowHeader)
    {
        @RenderPickerHeader
    }
    <div class="@(PrefixCls)-body">
        <table class="@(PrefixCls)-content">
            <thead>
                @RenderTableHeader
            </thead>
            <tbody>
				@{					
                    var startDate = ViewStartDate;
                    bool shouldStopRender = false;
					DateTime monthFirstDayDate = new DateTime(PickerValue.Year, PickerValue.Month, 1, 0, 0, 0);
					bool firstWeekNotInMonth = ViewStartDate.AddDays(7).Equals(monthFirstDayDate);	
                }
                @for (int row = 1; row <= MaxRow; row++)
                {
                    if (shouldStopRender)
                    {
                        break;
                    }
                    var startColDate = startDate;

                <tr class="@(GetRowClass?.Invoke(startColDate))"
                    @onclick="e => OnRowSelect?.Invoke(startColDate.CompareTo(monthFirstDayDate) < 0 && !firstWeekNotInMonth ? monthFirstDayDate: startColDate)">

                    @RenderFirstCol?.Invoke(startColDate.CompareTo(monthFirstDayDate) < 0 && !firstWeekNotInMonth ? monthFirstDayDate : startColDate)


                    @for (int col = 1; col <= MaxCol; col++)
                    {
                        if (shouldStopRender)
                        {
                            break;
                        }

                        if (Picker == DatePickerType.Date && row == 1 && col <= SkipDays)
                        {
                            <td>
                            </td>
                        }
                        else
                        {
                            var currentColDate = startDate;

                            string cellCls = GetCellCls(currentColDate);
                            string innerCellCls = GetInnerCellCls(currentColDate);

                            <td title="@GetColTitle?.Invoke(currentColDate)"
                                class="@cellCls"
                                @onmouseenter="e => DateOnMouseEnter(currentColDate)"
                                @onmouseleave="e => DateOnMouseLeave()"
                                @onclick="e=> OnValueSelect?.Invoke(currentColDate)" >
                                <div class="@innerCellCls"> 
                                    @if (IsCalendar)
                                    {
                                        <div class="@(PrefixCls)-calendar-date-value">
                                            @if (Picker == DatePickerType.Date && DateRender != null)
                                            {
                                                @(DateRender(currentColDate, DatePicker.CurrentDate))
                                            }
                                            else if (Picker == DatePickerType.Month && MonthCellRender != null)
                                            {
                                                @(MonthCellRender(currentColDate))
                                            }
                                            else
                                            {
                                                @RenderColValue(currentColDate)
                                            }
                                        </div>
                                        <div class="@(PrefixCls)-calendar-date-content">
                                            @if (Picker == DatePickerType.Date && CalendarDateRender != null)
                                            {
                                                @(CalendarDateRender(currentColDate))
                                            }
                                            else if (Picker == DatePickerType.Month && CalendarMonthCellRender != null)
                                            {
                                                @(CalendarMonthCellRender(currentColDate))
                                            }
                                        </div>
                                    }
                                    else
                                    {
                                        @if (Picker == DatePickerType.Date && DateRender != null)
                                        {
                                            @(DateRender(currentColDate, DatePicker.CurrentDate))
                                        }
                                        else if (Picker == DatePickerType.Month && MonthCellRender != null)
                                        {
                                            @(MonthCellRender(currentColDate))
                                        }
                                        else
                                        {
                                            @RenderColValue(currentColDate)
                                        }
                                    }
                                </div>
                            </td>

                            startDate = @GetNextColValue(currentColDate);

                            if (ShouldStopRenderDate(currentColDate, startDate))
                            {
                                shouldStopRender = true;
                            }
                        }

                    }

                    @{ var endColDate = startDate;}
                    @RenderLastCol?.Invoke(endColDate)
                </tr>
                }
            </tbody>
        </table>
    </div>
</div>
